#include "stdafx.h"
#include "dialogoprincipal.h"
#include "compiladorexpresiones.h"

DialogoPrincipal::DialogoPrincipal(QWidget *parent, Qt::WFlags flags)
    : QDialog(parent, flags)
{
    ui.setupUi(this);

    factoriaVariables.setListaVariables(&listaVariables);
    modeloVariables.setListaVariables(&listaVariables);
    ui.tablaVariables->setModel(&modeloVariables);

    listaTipos.append("Nulo");
    listaTipos.append("Booleano");
    listaTipos.append("Entero");
    listaTipos.append("Real");
    listaTipos.append("Cadena");
}

DialogoPrincipal::~DialogoPrincipal()
{

}


void DialogoPrincipal::on_botonEvaluar_clicked()
{
    actualizarVariables();

    CompiladorExpresiones compiladorExpresiones(&factoriaVariables);
    NodoExpresion* expresion = compiladorExpresiones.compilar(ui.editorExpresion->toPlainText());
    if (expresion == NULL) {
        ui.editorResultado->setText(compiladorExpresiones.getMensajeError());
        return;
    }
    Valor valor = expresion->evaluar();
    ui.editorResultado->setText(valor.toString());
    ui.etiquetaResultado->setText("Resultado: (" + listaTipos.at(valor.getTipo()) + ")");
}

void DialogoPrincipal::on_botonAgregarVariable_clicked()
{
    listaVariables.append(new VariableTest("", ""));
    modeloVariables.actualizar();
    crearEditoresTabla();
}

void DialogoPrincipal::crearEditoresTabla()
{
    for (int i = 0; i < listaVariables.size(); i++) {
        QModelIndex indiceNombre = modeloVariables.index(i, 0);
        QModelIndex indiceValor = modeloVariables.index(i, 1);
        QModelIndex indiceTipo = modeloVariables.index(i, 2);

        QWidget* widget = ui.tablaVariables->indexWidget(indiceNombre);
        if (widget != NULL) {
            continue;
        }
       
        VariableTest* variable = listaVariables[i];

        QLineEdit* editorNombre = new QLineEdit(ui.tablaVariables);
        editorNombre->setStyleSheet("border: none;");
        ui.tablaVariables->setIndexWidget(indiceNombre, editorNombre);

        QLineEdit* editorValor = new QLineEdit(ui.tablaVariables);
        editorValor->setStyleSheet("border: none;");
        ui.tablaVariables->setIndexWidget(indiceValor, editorValor);

        QComboBox* comboTipo = new QComboBox(ui.tablaVariables);
        comboTipo->addItems(listaTipos);
        comboTipo->setStyleSheet("border: none;");
        ui.tablaVariables->setIndexWidget(indiceTipo, comboTipo);
    }
}

void DialogoPrincipal::actualizarVariables()
{
    for (int i = 0; i < listaVariables.size(); i++) {
         VariableTest* variable = listaVariables[i];

        QModelIndex indiceNombre = modeloVariables.index(i, 0);
        QModelIndex indiceValor = modeloVariables.index(i, 1);
        QModelIndex indiceTipo = modeloVariables.index(i, 2);
        
        QLineEdit* editorNombre = dynamic_cast<QLineEdit*>(ui.tablaVariables->indexWidget(indiceNombre));
        QLineEdit* editorValor = dynamic_cast<QLineEdit*>(ui.tablaVariables->indexWidget(indiceValor));
        QComboBox* comboTipo = dynamic_cast<QComboBox*>(ui.tablaVariables->indexWidget(indiceTipo));
        if (editorNombre != NULL && editorValor != NULL && comboTipo != NULL) {
            variable->setNombre(editorNombre->text().trimmed());
            variable->setValor(editorValor->text(), comboTipo->currentIndex());
        }
    }
}

